#include<bits/stdc++.h>
#include "graph.h"
#define N 205
#define fi first
#define se second
#define file(s) freopen(#s".in","r",stdin);freopen(#s".out","w",stdout)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const int inf=1e9;
const ll INF=2e18;
template<class I>I updiv(I x,I y){return (x%y==0?x/y:x/y+1);}
template<class I>bool cmin(I &x,I y){if(x>y)return x=y,1;return 0;}
template<class I>bool cmax(I &x,I y){if(x<y)return x=y,1;return 0;}

int deg[N],cnt[N];
int a[N][N],tot=1,pre[N],to[N];
int d[N][N];
bool vst[N];
void dfs(int x,int prt)
{
	deg[x]=NumberOfRoads();
	if(prt) pre[x]=LastRoad(),a[x][pre[x]]=prt;
	for(int i=1;i<=deg[x];i++)
	{
		if(a[x][i]&&vst[a[x][i]]) continue;
		if(i==pre[x]) continue;
		Move(i,2);
		if(Color()==2)
		{
			Move(LastRoad(),3);
			int p=x;
			while(Color()==2) Move(pre[p],2),p=a[p][pre[p]],to[p]=LastRoad();
			a[x][i]=p;
			while(p!=x) Move(to[p],2),p=a[p][to[p]];
			Move(i,2);
			a[a[x][i]][LastRoad()]=x;
			Move(LastRoad(),2);
		}
		else a[x][i]=++tot,dfs(a[x][i],x);
	}
	vst[x]=1;
	if(prt) Move(pre[x],1);
}
void Inspect(int R)
{
	dfs(1,0);
	memset(d,0x3f,sizeof(d));
	for(int i=1;i<=tot;i++)
		for(int j=1;j<=deg[i];j++)
			if(a[i][j]) d[i][a[i][j]]=1,d[a[i][j]][i]=1;
	for(int k=1;k<=tot;k++)
		for(int i=1;i<=tot;i++)
			for(int j=1;j<=tot;j++)
				if(i!=j&&j!=k&&i!=k) cmin(d[i][j],d[i][k]+d[k][j]);
	for(int i=1;i<=tot;i++)
		for(int j=i+1;j<=tot;j++)
			cnt[d[i][j]]++;
	for(int i=1;i<=R;i++) Answer(i,cnt[i]); 
}
//#include "graph.h"
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//
//#define MAX_N 201
//#define N_MOVE_MAX 1500000
//
//static int NNN;
//static int M;
//static int X;
//static int R;
//static int n_roads[MAX_N];
//static int road[MAX_N][MAX_N];
//static int road_idx[MAX_N][MAX_N];
//
//static int color[MAX_N];
//static int pos;
//static int last_road;
//
//static int called_answer[MAX_N];
//static int call_move;
//
//static int expected_answer[MAX_N];
//
//static void Wrong(int message) {
//	printf("Wrong Answer [%d]\n", message);
//	exit(1);
//}
//
//void Answer(int D, int A) {
//	if (!(1 <= D && D <= R)) {
//		Wrong(1);
//	}
//	if (called_answer[D] != -1) {
//		Wrong(2);
//	}
//	
//	called_answer[D] = A;
//}
//
//void Move(int I, int V) {
//	if (I < 1 || n_roads[pos] < I) {
//		Wrong(5);
//	}
//	if (V < 1 || X < V) {
//		Wrong(6);
//	}
//	
//	++call_move;
//	
//	if (call_move > N_MOVE_MAX) {
//		Wrong(7);
//	}
//	--I;
//	color[pos] = V;
//	last_road = road_idx[road[pos][I]][pos] + 1;
//	pos = road[pos][I];
//}
//
//int NumberOfRoads() {
//	return n_roads[pos];
//}
//
//int LastRoad() {
//	return last_road;
//}
//
//int Color() {
//	return color[pos];
//}
//
//int main(void) {
//	freopen("graph.in","r",stdin);
//	int i, j;
//	if (scanf("%d%d%d", &NNN, &X, &R) != 3) {
//		fprintf(stderr, "error: cannot read NNN, X and R.\n");
//		exit(1);
//	}
//	
//	if (NNN < 2 || MAX_N < NNN) {
//		fprintf(stderr, "error: NNN is out of bounds.\n");
//		exit(1);
//	}
//	
//	for (i = 0; i < NNN; ++i) {
//		scanf("%d", &(n_roads[i]));
//		M+=n_roads[i];
//		for (j = 0; j < NNN; ++j)
//			road_idx[i][j] = -1;
//		for (j = 0; j < n_roads[i]; ++j) {
//			scanf("%d", &(road[i][j]));
//			--road[i][j];
//			road_idx[i][road[i][j]] = j;
//		}
//	}
//	M/=2;
//	for (i = 1; i <= R; ++i) {
//		scanf("%d", &(expected_answer[i]));
//	}
//	
//	for (i = 0; i < NNN; ++i) {
//		color[i] = 1;
//	}
//	
//	pos = 0;
//	last_road = -1;
//	call_move = 0;
//	for (i = 1; i <= R; ++i)
//		called_answer[i] = -1;
//	
//	Inspect(R);
//	
//	for (i = 1; i <= R; ++i) {
//		if (called_answer[i] == -1) {
//			Wrong(3);
//		}
//		if (called_answer[i] != expected_answer[i]) {
//			Wrong(4);
//		}
//	}
//	printf("%.13lf\n",1.0*call_move/M);
//	printf("Accepted: #move = %d\n", call_move);
//	
//	return 0;
//}
